home *** CD-ROM | disk | FTP | other *** search
- Path: wugate!wucs1!uunet!lll-winken!ames!mailrus!ulowell!page
- From: page@swan.ulowell.edu (Bob Page)
- Newsgroups: comp.sources.amiga
- Subject: v89i074: diskchecker - check a disk for errors
- Message-ID: <12296@swan.ulowell.edu>
- Date: 16 Mar 89 19:21:40 GMT
- Organization: University of Lowell, Computer Science Dept.
- Lines: 942
- Approved: page@swan.ulowell.edu
-
- Submitted-by: chk@gpu.utcs.toronto.edu (C. Harald Koch)
- Posting-number: Volume 89, Issue 74
- Archive-name: dos/fs/diskchecker.1
-
- DiskChecker reads through every sector on a disk reporting any errors
- encountered.
-
- [uuencoded executable included. ..Bob]
-
- # This is a shell archive.
- # Remove everything above and including the cut line.
- # Then run the rest of the file through sh.
- #----cut here-----cut here-----cut here-----cut here----#
- #!/bin/sh
- # shar: Shell Archiver
- # Run the following text with /bin/sh to create:
- # README
- # makefile
- # devinfo.h
- # break.c
- # diskchecker.c
- # getdevinfo.c
- # getopt.c
- # diskchecker.uu
- # This archive created: Thu Mar 16 14:19:46 1989
- cat << \SHAR_EOF > README
- DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
-
- C. Harald Koch
- 260 Wellesley St. E.
- Toronto, ON Canada
- M4X 1G6
-
- chk@gpu.utcs.toronto.edu
-
- Permission is granted to distribute, modify, or use this program in
- whole or in part, so long as this copyright notice remains intact.
- This program may not be sold for profit without permission.
-
- Thanks to Dave Haynie for the original idea, which was based on his original
- version of DiskSalv. Some of the code is originally from that program.
-
- Thanks to Matt Dillon for his SIGBREAK routines (break.c) and for reams of
- insight into the innards of Amiga programming.
-
- What is DiskChecker?
-
- I often copy software onto floppies to take home from work or for archival
- purposes. Every once in a while, I would find that something had been
- written incorrectly to disk. Finally, I got tired of this, so I wrote
- DiskChecker.
-
- DiskChecker will read every sector on a disk, reporting any read errors
- found. To check a disk:
-
- 1> DiskChecker [-v|q] <device-name>
-
- where device-name is the name of a disk device (DF0:, FF0:, DH0:, RAD:, etc).
- DiskChecker will print statistics about the device, and then read through
- each sector on the disk. It will report any errors encountered by error
- number. In addition, if the error is a valid trackdisk.device error,
- DiskChecker will print a descriptive error message also. DiskChecker will
- abort if a CTRL-C or CTRL-D is typred.
-
- OPTIONS:
- -q - perform check quietly; only report errors encountered.
- -v - perform check verbosely; print every sector checked.
-
- BEWARE: DiskChecker tries to make certain sanity checks about devices being
- checked. It will not let you check CON:, for example. HOWEVER, these checks
- are far from perfect. You will crash your machine if you try to check SER:,
- PAR:, or PRT:, for example. Make sure the device statistics printed look
- reasonable before proceeding.
-
- COMPILATION NOTES:
-
- DiskChecker uses some structures that are new to the 1.3 header files. (The
- strucures have always existed; the header files have been reorganized to
- make accessing them from C easier). It currently requires libraries/dos.h,
- libraries/dosextens.h, and libraries/filehandler.h from the 1.3Includes disk.
-
-
- Please send me any bug reports, enhancements, suggestions, jelly beans, etc.
-
- C. Harald Koch
- 09-March-89
- SHAR_EOF
- cat << \SHAR_EOF > makefile
- # Makefile for DiskChecker using Aztec C 3.6a
- #
- SRCS = diskchecker.c getdevinfo.c break.c getopt.c
- OBJS = diskchecker.o getdevinfo.o break.o getopt.o
-
- CFLAGS = +p
- LFLAGS =
- LIBS = -lcl32
-
- all : diskchecker
-
- diskchecker : $(OBJS)
- ln $(LFLAGS) -o diskchecker $(OBJS) $(LIBS)
- SHAR_EOF
- cat << \SHAR_EOF > devinfo.h
- struct MyDevInfo {
- char *DeviceName; /* exec device name */
- ULONG Unit; /* exec unit number */
- ULONG DeviceFlags; /* flags to OpenDevice */
- ULONG BlockSize; /* in bytes */
- ULONG Surfaces; /* # of heads */
- ULONG BlocksPerTrack; /* blocks per track (not cylinder) */
- ULONG Reserved; /* number of reserved blocks at beginning */
- ULONG PreAlloc; /* number of reserved blocks at end */
- ULONG LowCyl; /* first cylinder */
- ULONG HighCyl; /* last cylinder */
- ULONG BufMemType; /* type of memory for buffers */
- ULONG DosType; /* 0x444F5300 or 0x444F5301 */
- };
-
- extern struct MyDevInfo *getDevInfo();
- SHAR_EOF
- cat << \SHAR_EOF > break.c
- /*-
- * break.c
- * Amiga BREAK signal handling
- *
- * Thanks to Matt Dillon (dillon@postgres.berkeley.edu) for these
- * routines, which are part of his support library.
- *
- -*/
-
- #include <libraries/dos.h>
-
- extern int Enable_Abort;
- extern long SetSignal();
-
- disablebreak()
- {
- Enable_Abort = 0;
- }
-
- enablebreak()
- {
- Enable_Abort = 1;
- }
-
-
- /*-
- * CHECKBREAK()
- *
- * Return 1 = break pressed,
- * 0 = break not pressed
- -*/
-
- #define SBF (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D)
-
- checkbreak()
- {
- return (SetSignal(0L,0L) & SBF) ? 1 : 0;
- }
- SHAR_EOF
- cat << \SHAR_EOF > diskchecker.c
- /*-
- * DiskChecker - check a floppy disk for errors
- *
- * DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
- *
- * DiskChecker is based on the original version of DiskSalv by Dave
- * Haynie. The DiskIO code is originally his.
- *
- * DiskChecker is freely redistributable, provided no fee is charged etc.
- *
- *
- * SYNOPSIS:
- * DiskChecker dfn:
- *
- * Will check the floppy in drive n for any errors at the track and sector level.
- *
- * Compiles under Aztec C 3.4 with 32 bit integers.
- *
- *
- -*/
-
- #include <exec/types.h>
- #include <exec/exec.h>
- #include <devices/trackdisk.h>
- #include <libraries/dos.h>
- #include <libraries/dosextens.h>
- #include <ctype.h>
- #include <stdio.h>
-
- #include <functions.h>
- #include "devinfo.h"
-
- extern void * CreateExtIO();
-
- char prog_version[] = "1.0";
-
- char *td_errors[] = {
- /* 20 TDERR_NotSpecified */ "Undetermined Error",
- /* 21 TDERR_NoSecHdr */ "Couldn't Find Sector Header",
- /* 22 TDERR_BadSecPreamble */ "Error in Sector Preamble",
- /* 23 TDERR_BadSecID */ "Error in Sector Identifier",
- /* 24 TDERR_BadHdrSum */ "Bad Header Field Checksum",
- /* 25 TDERR_BadSecSum */ "Bad Sector Data Field Checksum",
- /* 26 TDERR_TooFewSecs */ "Incorrect Number of Sectors on Track",
- /* 27 TDERR_BadSecHdr */ "Unable to Read Sector Header",
- /* 28 TDERR_WriteProt */ "Disk is Write Protected",
- /* 29 TDERR_DiskChanged */ "Disk Changed or not Present",
- /* 30 TDERR_SeekError */ "Seek Error While Verifying Seek Position",
- /* 31 TDERR_NoMem */ "Not Enough Memory",
- /* 32 TDERR_BadUnitNum */ "Bad Unit Number",
- /* 33 TDERR_BadDriveType */ "Bad Drive Type",
- /* 34 TDERR_DriveInUse */ "Drive In Use",
- /* 35 TDERR_PostReset */ "TDERR_PostReset"
- };
-
- #define LOWTDERR 20
- #define HIGHTDERR 35
-
- #define NUM_CYLS (mdi->HighCyl - mdi->LowCyl + 1)
- #define DISK_SIZE (mdi->Surfaces*NUM_CYLS*mdi->BlocksPerTrack)
- #define READOK 0
-
- LONG diskChangeCount = 0; /* Checks for changed disk */
- int verbose = 0; /* print every sector? */
- int summary = 1; /* print every cylinder? */
-
-
- static void
- MotorOff(req)
- struct IOExtTD *req;
- {
- req->iotd_Req.io_Length = 0;
- req->iotd_Req.io_Command = TD_MOTOR;
- DoIO(req);
- }
-
-
- static void
- InitDisk(req)
- struct IOExtTD *req;
- {
- req->iotd_Req.io_Command = TD_CHANGENUM;
- DoIO(req);
- diskChangeCount = req->iotd_Req.io_Actual;
- }
-
-
- BYTE
- ReadBuf(req, buf, sect, len)
- struct IOExtTD *req;
- char *buf;
- ULONG sect;
- ULONG len;
- {
- req->iotd_Req.io_Length = len;
- req->iotd_Req.io_Data = (APTR) buf;
- req->iotd_Req.io_Command = ETD_READ;
- req->iotd_Count = diskChangeCount;
- req->iotd_Req.io_Offset = len * sect;
- DoIO(req);
- return (req->iotd_Req.io_Error);
- }
-
-
- int
- checkDisk(mdi)
- struct MyDevInfo *mdi;
- {
- ULONG sect, head, block, cylinder; /* Current block */
- BYTE result;
- struct IOExtTD *diskreq = NULL;
- struct MsgPort *diskport = NULL;
- char *buf = NULL;
-
- if ((diskport = (struct MsgPort *) CreatePort("diskreq.port", 0)) == NULL) {
- printf("ERROR: Cannot create message port\n");
- goto error;
- }
-
- if ((diskreq = (struct IOExtTD *)
- CreateExtIO(diskport, sizeof(struct IOExtTD))) == NULL) {
- printf("ERROR: Cannot create I/O port\n");
- goto error;
- }
-
- if ((buf = (char *) AllocMem(mdi->BlockSize, mdi->BufMemType)) == NULL)
- goto error;
-
- if (OpenDevice(mdi->DeviceName, mdi->Unit, diskreq, 0)) {
- printf("ERROR: Cannot open TrackDisk device\n");
- goto error;
- }
-
- InitDisk(diskreq);
-
- sect = 0;
- printf("\2330 p"); /* turn cursor off for faster rendering */
-
- for (cylinder = mdi->LowCyl; cylinder <= mdi->HighCyl; cylinder++) {
- for (head = 0; head < mdi->Surfaces; head++) {
- for (block = 0; block < mdi->BlocksPerTrack; block++, sect++) {
-
- if ((result = ReadBuf(diskreq, buf, sect, mdi->BlockSize)) != READOK) {
- printf(" Block %6d (C:%04d H:%d S:%02d) ", sect,
- cylinder, head, block);
- if (result >= LOWTDERR && result <= HIGHTDERR) {
- printf(" Error %2d: %s\n", result, td_errors[result - LOWTDERR]);
- }
- else {
- printf("Error %2d: Unknown Trackdisk Error\n", result);
- }
- }
- else {
- if (verbose || (summary && head == 0 && block == 0)) {
- printf(" Block %6d (C:%04d H:%d S:%02d) ", sect,
- cylinder, head, block);
- printf("(OK)\233K\r");
- }
- }
- fflush(stdout);
-
- if (checkbreak()) {
- printf("\nBREAK detected!\n");
- printf("\233 p"); /* turn cursor back on */
- goto error;
- }
- }
- }
- }
- printf("\233 p\n");
-
- error:
- if (buf != NULL)
- FreeMem(buf, mdi->BlockSize);
- if (diskreq != NULL) {
- MotorOff(diskreq);
- CloseDevice(diskreq);
- DeleteExtIO(diskreq, sizeof(struct IOExtTD));
- }
- if (diskport != NULL)
- DeletePort(diskport);
-
- return 0;
- }
-
-
- usage(s)
- char *s;
- {
- fprintf(stderr, "usage: %s [-v|q] <dos-device-name>\n", s);
- }
-
- extern int getopt();
- extern int optind;
- extern char *optarg;
-
- int
- main(argc, argv)
- int argc;
- char *argv[];
- {
- char stat;
- int c;
- extern char *optarg;
- char name[20];
- int len;
- struct MyDevInfo *mdi;
-
- disablebreak();
-
- printf("\nDiskChecker %s Copyright 1989 C. Harald Koch\n\n", prog_version);
-
- while((c = getopt(argc, argv, "vq")) != EOF) {
- switch(c) {
- case 'v': /* run verbosely; print every sector */
- verbose = 1;
- break;
- case 'q': /* run quitely; only print errors */
- verbose = summary = 0;
- break;
- default:
- usage(argv[0]);
- enablebreak();
- exit(20);
- }
- }
-
- if (optind != argc - 1) {
- usage(argv[0]);
- enablebreak;
- exit(10);
- }
-
- strcpy(name, argv[optind]);
- len = strlen(name);
- if (name[len - 1] == ':') {
- name[len - 1] = '\0';
- len--;
- }
-
- touppers(name);
-
- if ((mdi = getDevInfo(name)) != NULL) {
- printf("DEVICE = %s (%s)\n", mdi->DeviceName, name);
- printf("UNIT = %5ld FLAGS = %5ld\n", mdi->Unit, mdi->DeviceFlags);
- printf("HEADS = %5ld SECTORS = %5ld\n", mdi->Surfaces, mdi->BlocksPerTrack);
- printf("LOCYL = %5ld HICYL = %5ld\n", mdi->LowCyl, mdi->HighCyl);
- printf("LOBLOCK = %5ld HIBLOCK = %5ld\n",
- mdi->LowCyl * mdi->Surfaces * mdi->BlocksPerTrack,
- (mdi->HighCyl + 1) * mdi->Surfaces * mdi->BlocksPerTrack - 1);
- printf("RESERVED = %5ld MEMTYPE = %5ld\n", mdi->Reserved, mdi->BufMemType);
- printf("FILESYS = %5s DISK SIZE = %5ld\n",
- (mdi->DosType == 0x444f5300) ? "OFS" : "FFS",
- (mdi->HighCyl - mdi->LowCyl + 1) * mdi->Surfaces * mdi->BlocksPerTrack);
-
- printf("\nShould I Continue? [y] ");
- if ((c = getchar()) != 'y' && c != 'Y' && c != '\n') {
- printf("Aborting...\n");
- exit(20);
- }
-
- stat = checkDisk(mdi);
-
- enablebreak();
- exit(stat);
-
- }
- else {
- printf("device not found (or device is not a disk device)\n");
- enablebreak();
- exit(20);
- }
- }
- SHAR_EOF
- cat << \SHAR_EOF > getdevinfo.c
- /*-
- * getdevinfo.c - get filesystem information about a disk device
- *
- * DiskChecker 1.0 Copyright 1989 C. Harald Koch. All Rights Reserved.
- *
- -*/
-
- #include "libraries/dos.h"
- #include "libraries/dosextens.h"
- #include "libraries/filehandler.h"
- #include <exec/memory.h>
-
- #include <ctype.h>
- #include <stdio.h>
-
- #include "devinfo.h"
-
- extern struct DosLibrary *DOSBase;
- extern void *AllocMem();
-
- #define CTOB(x) (void *)(((long)(x))>>2) /* BCPL conversion */
- #define BTOC(x) (void *)(((long)(x))<<2)
-
- touppers(s)
- char *s;
- {
- while (*s) {
- *s = (islower(*s)) ? toupper(*s) : *s;
- s++;
- }
- }
-
- void
- BtoCStr(cstr, bstr)
- char *cstr;
- BPTR bstr;
- {
- char *bstr2;
- int i;
-
- bstr2 = BTOC(bstr);
- for (i = 0; i < bstr2[0]; i++) {
- cstr[i] = bstr2[i + 1];
- }
- cstr[i] = '\0';
- }
-
-
- struct MyDevInfo *
- getDevInfo(name)
- char *name;
- {
- struct RootNode *root;
- struct DosInfo *info;
- struct DeviceNode *dnode;
- struct FileSysStartupMsg *fsmsg;
- struct DosEnvec *env;
- long unit;
- char dosname[20];
- char execname[256];
- long flags;
- struct MyDevInfo *mdi;
- root = (struct RootNode *) DOSBase->dl_Root;
- info = (struct DosInfo *) BTOC(root->rn_Info);
- dnode = (struct DeviceNode *) BTOC(info->di_DevInfo);
-
- for (; dnode != NULL;) {
- if (dnode->dn_Type == DLT_DEVICE) {
- BtoCStr(dosname, dnode->dn_Name);
- if (strcmp(name, dosname) == 0) {
- /* found it! */
- fsmsg = (struct FileSysStartupMsg *) BTOC(dnode->dn_Startup);
- if (fsmsg != NULL) {
- char *bcplname;
- long namelen;
-
- mdi = AllocMem(sizeof(*mdi), MEMF_CLEAR);
- bcplname = BTOC(fsmsg->fssm_Device);
- namelen = bcplname[0] + 1;
- mdi->DeviceName = AllocMem(namelen, 0L);
- BtoCStr(mdi->DeviceName, fsmsg->fssm_Device);
- mdi->Unit = fsmsg->fssm_Unit;
- mdi->DeviceFlags = fsmsg->fssm_Flags;
- env = BTOC(fsmsg->fssm_Environ);
- mdi->BlockSize = env->de_SizeBlock * 4;
- mdi->Surfaces = env->de_Surfaces;
- mdi->BlocksPerTrack = env->de_BlocksPerTrack;
- mdi->Reserved = env->de_Reserved;
- mdi->PreAlloc = env->de_PreAlloc;
- mdi->LowCyl = env->de_LowCyl;
- mdi->HighCyl = env->de_HighCyl;
- if (env->de_TableSize >= 12) {
- mdi->BufMemType = env->de_BufMemType;
- }
- else {
- mdi->BufMemType = MEMF_CHIP;
- }
- if (env->de_TableSize >= 16) {
- mdi->DosType = env->de_DosType;
- }
- else {
- mdi->DosType = 0x444f5300;
- }
-
- return mdi;
- }
- }
- }
- dnode = (struct DeviceNode *) BTOC(dnode->dn_Next);
- }
- return NULL;
- }
- SHAR_EOF
- cat << \SHAR_EOF > getopt.c
- /*-
- ** @(#)getopt.c 2.5 (smail) 9/15/87
- -*/
-
- /*-
- * Here's something you've all been waiting for: the AT&T public domain
- * source for getopt(3). It is the code which was given out at the 1985
- * UNIFORUM conference in Dallas. I obtained it by electronic mail
- * directly from AT&T. The people there assure me that it is indeed
- * in the public domain.
- *
- * There is no manual page. That is because the one they gave out at
- * UNIFORUM was slightly different from the current System V Release 2
- * manual page. The difference apparently involved a note about the
- * famous rules 5 and 6, recommending using white space between an option
- * and its first argument, and not grouping options that have arguments.
- * Getopt itself is currently lenient about both of these things White
- * space is allowed, but not mandatory, and the last option in a group can
- * have an argument. That particular version of the man page evidently
- * has no official existence, and my source at AT&T did not send a copy.
- * The current SVR2 man page reflects the actual behavor of this getopt.
- * However, I am not about to post a copy of anything licensed by AT&T.
- -*/
-
-
- /* LINTLIBRARY */
- #define NULL 0
- #define EOF (-1)
- #define ERR(s, c) if(opterr){\
- extern int write();\
- char errbuf[2];\
- errbuf[0] = c; errbuf[1] = '\n';\
- (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
- (void) write(2, s, (unsigned)strlen(s));\
- (void) write(2, errbuf, 2);}
-
- extern char *index();
-
- int opterr = 1;
- int optind = 1;
- int optopt;
- char *optarg;
-
- int
- getopt(argc, argv, opts)
- int argc;
- char **argv, *opts;
- {
- static int sp = 1;
- register int c;
- register char *cp;
-
- if (sp == 1)
- if (optind >= argc ||
- argv[optind][0] != '-' || argv[optind][1] == '\0')
- return (EOF);
- else if (strcmp(argv[optind], "--") == NULL) {
- optind++;
- return (EOF);
- }
- optopt = c = argv[optind][sp];
- if (c == ':' || (cp = index(opts, c)) == NULL) {
- ERR(": illegal option -- ", c);
- if (argv[optind][++sp] == '\0') {
- optind++;
- sp = 1;
- }
- return ('?');
- }
- if (*++cp == ':') {
- if (argv[optind][sp + 1] != '\0')
- optarg = &argv[optind++][sp + 1];
- else if (++optind >= argc) {
- ERR(": option requires an argument -- ", c);
- sp = 1;
- return ('?');
- }
- else
- optarg = argv[optind++];
- sp = 1;
- }
- else {
- if (argv[optind][++sp] == '\0') {
- sp = 1;
- optind++;
- }
- optarg = NULL;
- }
- return (c);
- }
- SHAR_EOF
- cat << \SHAR_EOF > diskchecker.uu
-
- begin 644 diskchecker
- M```#\P`````````#``````````(```I:````K0```!D```/I```*6D[Z%!I5`
- M;F1E=&5R;6EN960@17)R;W(`0V]U;&1N)W0@1FEN9"!396-T;W(@2&5A9&5R3
- M`$5R<F]R(&EN(%-E8W1O<B!0<F5A;6)L90!%<G)O<B!I;B!396-T;W(@261E<
- M;G1I9FEE<@!"860@2&5A9&5R($9I96QD($-H96-K<W5M`$)A9"!396-T;W(@O
- M1&%T82!&:65L9"!#:&5C:W-U;0!);F-O<G)E8W0@3G5M8F5R(&]F(%-E8W1O6
- M<G,@;VX@5')A8VL`56YA8FQE('1O(%)E860@4V5C=&]R($AE861E<@!$:7-KQ
- M(&ES(%=R:71E(%!R;W1E8W1E9`!$:7-K($-H86YG960@;W(@;F]T(%!R97-E7
- M;G0`4V5E:R!%<G)O<B!7:&EL92!697)I9GEI;F<@4V5E:R!0;W-I=&EO;@!.K
- M;W0@16YO=6=H($UE;6]R>0!"860@56YI="!.=6UB97(`0F%D($1R:79E(%1Y@
- M<&4`1')I=F4@26X@57-E`%1$15)27U!O<W1297-E=```3E4``$CG,`(@;0`(5
- M0J@`)"!M``@Q?``)`!PO+0`(3KD``"A46$],WT`,3EU.=4Y5``!(YS`"(&T`Y
- M"#%\``T`'"\M``A.N0``*%183R!M``@CZ``@````1$S?0`Q.74YU3E4``$CGG
- M,`(@;0`((6T`%``D(&T`""%M``P`*"!M``@Q?(`"`!P@;0`((7D```!$`#`@'
- M;0`((BT`$"`M`!1.N0``);0A0``L+RT`"$ZY```H5%A/(&T`"!`H`!](@$C`L
- M3-]`#$Y=3G5.5?_B2.<P`D*M_^I"K?_F0JW_XD*G2'H"EDZY```FKE!/*T#_M
- MYF802'H"D4ZY```91%A/8``"%DAX`#@O+?_F3KD``">R4$\K0/_J9A!(>@*.(
- M3KD``!E$6$]@``'P(&T`""\H`"@@;0`(+R@`#$ZY```H/E!/*T#_XF<``=!"Z
- MIR\M_^H@;0`(+R@`!"!M``@O$$ZY```HT$_O`!!*@&<02'H"6TZY```91%A/H
- M8``!GB\M_^I.NOZP6$]"K?_\2'H"8DZY```91%A/(&T`""MH`"#_\&```5I"P
- MK?_X8``!/D*M__1@``$B(&T`""\H``PO+?_\+RW_XB\M_^I.NOZ:3^\`$!M`"
- M_^]G>B\M__0O+?_X+RW_\"\M__Q(>@(+3KD``!E$3^\`%`PM`!3_[VT\#"T`U
- M(__O;C00+?_O2(!(P)"\````%.6`0?D````$+S`(`!`M_^](@$C`+P!(>@'JO
- M3KD``!E$3^\`#&`6$"W_[TB`2,`O`$AZ`>!.N0``&4103V!&2KD```!(9A1*I
- MN0```$QG-DJM__AF,$JM__1F*B\M__0O+?_X+RW_\"\M__Q(>@'*3KD``!E$5
- M3^\`%$AZ`=U.N0``&4183TAX__](>0```09.N0``'X!03TZY```-^$J`9QI(G
- M>@&]3KD``!E$6$](>@'#3KD``!E$6$]@3%*M__12K?_\(&T`""`M__2PJ``4M
- M90#^TE*M__@@;0`(("W_^+"H`!!E`/ZV4JW_\"!M``@@+?_PL*@`)&,`_II(#
- M>@%Y3KD``!E$6$]*K?_B9Q0@;0`(+R@`#"\M_^).N0``*(I03TJM_^IG)B\MH
- M_^I.NOS&6$\O+?_J3KD``":,6$](>``X+RW_ZDZY```G_%!/2JW_YF<,+RW_O
- MYDZY```G1EA/<`!,WT`,3EU.=61I<VMR97$N<&]R=`!%4E)/4CH@0V%N;F]T#
- M(&-R96%T92!M97-S86=E('!O<G0*`$524D]2.B!#86YN;W0@8W)E871E($DO[
- M3R!P;W)T"@!%4E)/4CH@0V%N;F]T(&]P96X@5')A8VM$:7-K(&1E=FEC90H`1
- MFS`@<``@0FQO8VL@)39D("A#.B4P-&0@2#HE9"!3.B4P,F0I(``@17)R;W(@-
- M)3)D.B`E<PH`17)R;W(@)3)D.B!5;FMN;W=N(%1R86-K9&ES:R!%<G)O<@H`:
- M($)L;V-K("4V9"`H0SHE,#1D($@Z)60@4SHE,#)D*2``*$]+*9M+#0`*0E)%I
- M04L@9&5T96-T960A"@";('``FR!P"@!.50``2.<P`B\M``A(>@`:2'D```$<;
- M3KD``!+B3^\`#$S?0`Q.74YU=7-A9V4Z("5S(%LM=GQQ72`\9&]S+61E=FECS
- M92UN86UE/@H`3E7_WDCG,`).N0``#<A(>0````!(>@+^3KD``!E$4$](>@,BE
- M+RT`#"\M``A.N0``#B)/[P`,*T#_^K"\_____V=0("W_^F`Z(_P````!````0
- M2&`\0KD```!,0KD```!(8"X@;0`,+Q!.NO]*6$].N0``#=Y(>``43KD``"/"^
- M6$]@#I"\````<6?*6X!GNF#28(X@+0`(4X"PN0```%1G'B!M``PO$$ZZ_PQ8,
- M3T'Y```-WDAX``I.N0``(\)83R`Y````5.6`(&T`#"\P"`!(;?_F3KD``!$\1
- M4$](;?_F3KD``!%,6$\K0/_B("W_XD'M_^4,,``Z"`!F$"`M_^);0@;?_>(B@`%$ZYC
- M```EM"\`2'H!_DZY```91$_O``P@;?_>+R@`*"!M_]XO*``82'H"#DZY```9K
- M1$_O``P@;?_>("@`)"!M_]Z0J``@4H`@;?_>(B@`$$ZY```EM"!M_]XB*``4D
- M3KD``"6T+P`@;?_>#*A$3U,``"QF"$'Z`AT@"&`&0?H"&2`(+P!(>@'@3KD`L
- M`!E$3^\`#$AZ`@=.N0``&4183TAY````\$ZY```1CEA/*T#_^K"\````>6<L7
- M#*T```!9__IG(@RM````"O_Z9QA(>@'F3KD``!E$6$](>``43KD``"/"6$\O9
- M+?_>3KKY*%A/&T#__TZY```-WA`M__](@$C`+P!.N0``(\)83V`>2'H!LTZYM
- M```91%A/3KD```W>2'@`%$ZY```CPEA/3-]`#$Y=3G4*1&ES:T-H96-K97(@L
- M)7,@0V]P>7)I9VAT(#$Y.#D@0RX@2&%R86QD($MO8V@*"@!V<0!$159)0T4@9
- M("`@(#T@("`@)7,@("`H)7,I"@!53DE4("`@("`@(#T@("`@)35L9"`@("!&U
- M3$%'4R`@("`@(#T@("`@)35L9`H`2$5!1%,@("`@("`]("`@("4U;&0@("`@D
- M4T5#5$]24R`@("`]("`@("4U;&0*`$Q/0UE,("`@("`@/2`@("`E-6QD("`@>
- M($A)0UE,("`@("`@/2`@("`E-6QD"@!,3T),3T-+("`@(#T@("`@)35L9"`@W
- M("!(24),3T-+("`@(#T@("`@)35L9`H`4D5315)6140@("`]("`@("4U;&0@T
- M("`@345-5%E012`@("`]("`@("4U;&0*`$9)3$5365,@("`@/2`@("`E-7,@[
- M("`@1$E32R!325I%("`]("`@("4U;&0*`$]&4P!&1E,`"E-H;W5L9"!)($-O2
- M;G1I;G5E/R!;>5T@`$%B;W)T:6YG+BXN"@!D979I8V4@;F]T(&9O=6YD("AOA
- M<B!D979I8V4@:7,@;F]T(&$@9&ES:R!D979I8V4I"@!.50``2.<P`B!M``A*A
- M$&=$(&T`"!`02(!(P$'Y````;P@P``$(`&<6(&T`"!`02(!(P"\`3KD``!%>1
- M6$]@"B!M``@0$$B`2,`@;0`($(!2K0`(8+1,WT`,3EU.=4Y5__A(YS`"("T`#
- M#.6`*T#__$*M__A@&B!M__S1[?_X("W_^")M``@3J``!"`!2K?_X(&W__!`0Q
- M2(!(P"(M__BR@&W4("W_^"!M``A",`@`3-]`#$Y=3G5.5?[$2.<P`B!Y````@
- M""MH`"+__"!M__P@*``8Y8`K0/_X(&W_^"`H``3E@"M`__1@``&>(&W_]$JHK
- M``1F``&&(&W_]"\H`"A(;?_43KK_6E!/2&W_U"\M``A.N0``$TQ03TJ`9@`!:
- M7B!M__0@*``<Y8`K0/_P2JW_\&<``4A(>0`!``!(>``P3KD``"@^4$\K0/[,*
- M(&W_\"`H``3E@"M`_L@@;?[($!!(@$C`4H`K0/[$0J<O+?[$3KD``"@^4$\@3
- M;?[,((`@;?_P+R@`!"!M_LPO$$ZZ_M)03R!M__`B;?[,(U``!"!M__`B;?[,<
- M(V@`#``((&W_\"`H``CE@"M`_^P@;?[,(FW_["`I``3E@"%```P@;?_L(FW^;
- MS"-H``P`$"!M_^PB;?[,(V@`%``4(&W_[")M_LPC:``8`!@@;?_L(FW^S"-H?
- M`!P`'"!M_^PB;?[,(V@`)``@(&W_[")M_LPC:``H`"0@;?_L#)`````,91`@U
- M;?_L(FW^S"-H`#``*&`,(&W^S"%\`````@`H(&W_[`R0````$&40(&W_[")M^
- M_LPC:`!``"Q@#"!M_LPA?$1/4P``+"`M_LQ,WT`,3EU.=2!M__0@$.6`*T#_N
- M]$JM__1F`/Y><`!@X$Y5``!(YS`"0KD````,3-]`#$Y=3G5.50``2.<P`B/\C
- M`````0````Q,WT`,3EU.=4Y5``!(YS`"0J="ITZY```I%E!/P+P``#``9P1PT
- M`6`"<`!,WT`,3EU.=4Y5__Y(YS@B#+D````!````6&9L(#D```!4L*T`"&PL[
- M(#D```!4Y8`@;0`,(G`(``P1`"UF%B`Y````5.6`(&T`#")P"`!**0`!9@IPD
- M_TS?1!Q.74YU2'H"4"`Y````5.6`(&T`#"\P"`!.N0``$TQ03TJ`9@I2N0``H
- M`%1P_V#.(#D```!4Y8`@;0`,(C`(`"!Y````6!`P&`!(@$C`*``CP````!"XB
- MO````#IG%B\$+RT`$$ZY```3,E!/)$!*@&8``*9*N0```%!G9!M$__X;?``*2
- M__\@;0`,+Q!.N0``$4Q83R\`(&T`#"\02'@``DZY```BMD_O``Q(>@'$3KD`A
- M`!%,6$\O`$AZ`:%(>``"3KD``"*V3^\`#$AX``)(;?_^2'@``DZY```BMD_O5
- M``P@.0```%3E@"!M``PB,`@`4KD```!8('D```!82C`8`&804KD```!4(_P`K
- M```!````6'`_8`#^Z%**#!(`.F8``/H@.0```%3E@"!M``PB<`@`T_D```!8+
- M2BD``6<H(#D```!44KD```!4Y8`@;0`,(C`(`-*Y````6%*!(\$````48```U
- MJE*Y````5"`Y````5+"M``AM?$JY````4&=D&T3__AM\``K__R!M``PO$$ZY\
- M```13%A/+P`@;0`,+Q!(>``"3KD``"*V3^\`#$AZ`/=.N0``$4Q83R\`2'H`K
- MQTAX``).N0``(K9/[P`,2'@``DAM__Y(>``"3KD``"*V3^\`#"/\`````0``Q
- M`%AP/V``_@P@.0```%12N0```%3E@"!M``PC\`@`````%"/\`````0```%A@"
- M."`Y````5.6`(&T`#"(P"`!2N0```%@@>0```%A*,!@`9A`C_`````$```!81
- M4KD```!40KD````4(`1@`/VH+2T`.B!I;&QE9V%L(&]P=&EO;B`M+2``.B!I[
- M;&QE9V%L(&]P=&EO;B`M+2``.B!O<'1I;VX@<F5Q=6ER97,@86X@87)G=6UE7
- M;G0@+2T@`#H@;W!T:6]N(')E<75I<F5S(&%N(&%R9W5M96YT("TM(```(&\`:
- M!"`((F\`"!#99OQ.=2!O``0@"$H89OR1P"`(4X!.=7``$"\`![`\`&!C"K`\\
- M`'IB!)`\`"!.=7``$"\`![`\`$!C"K`\`%IB!-`\`"!.=4Y5``!(YS@B)&T`V
- M""\*3KD``!'2*`"PO/____]83V<@(`1@%%.2".H``P`,</],WT0<3EU.=6#4#
- M2H!G^EF`9^0@!J3E4``$CG,"(D;0`((%*QZ@`$90XO"F$<6$],WT0,3EU./
- M=2!24I(0$$B`2,#`O````/]@YDY5``!(YS@R)&T`"!`J``S`/``89PIP_TS?V
- M3!Q.74YU"*H``@`,2JH`"&8*+PI.N0``(+I83Q`J``Q(@$C`"```!V<\0?D`%
- M``#P)D@0*P`,2(!(P,"\````A+"\````A&8.2'C__R\+3KD``!^`4$_7_```I
- M`!9!^0```JBWR&7,,"H`$$C`+P`O*@`($"H`#4B`2,`O`$ZY```3?"@`2H!/)
- M[P`,;A1*A&8$<`A@`G`0@2H`#'#_8`#_8"2J``@@:@`(T<0E2``$(%)2DA`08
- M2(!(P,"\````_V``_SY.50``2.<P`B/M``@`````2&T`$"\M``Q(>@`43KD`.
- M`!GX3^\`#$S?0`Q.74YU3E4``$CG,`(O.0`````O+0`(3KD``!XN4$],WT`,Y
- M3EU.=2!O``0@+P`($AAG"K(`9O@@"%.`3G5P`$YU,#Q__V`$,"\`#E-`:Q0@A
- M;P`$(F\`"+$)9@Q32$H85\C_]G``3G5C!'`!3G5P_TYU3E4``$CG/"(H+0`(6
- M3KD``"-,<@8@!$ZY```EM"1`U?D````82H1M$#`Y```"J$C`N(!L!$J29A0C#
- M_`````(````<</],WT0\3EU.=3`J``1(P,"\`````["\`````68.(_P````%,
- M````''#_8-8O+0`0+RT`#"\23KD``"8^*@"PO/____]/[P`,9A!.N0``)@PCO
- MP````!QP_V"H(`5@I&%\0_D```*T1?D`````M<EF#C(\`!AK"'0`(L)1R?_\A
- M(\\````@+'@`!"/.````)$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-#H
- M^@`D3J[^:"/`````"&8,+CP``X`'3J[_E&`&3KD``!2B4$].=61O<RYL:6)R"
- M87)Y`$GY``!__DYU3E4``$CG,")(>0`!```P.0```JC!_``&+P!.N0``*$0C/
- MP````!A03V880J=(>0`!``!.N0``)G)03RYY````($YU('D````80F@`!"!Y@
- M````%\``$`$"!Y````%\``$`"B!Y````("`Y````()"H``10@"/`````@
- M*"!Y````*""\34%.6$*G3KD``"AR)$!*J@"L6$]G."\M``PO+0`(+PI.N0``9
- M%BPC_`````$````,('D````8`&B````$('D````8`&B````*3^\`#&!62&H`@
- M7$ZY```I+$AJ`%Q.N0``*+`CP````"P@>0```"Q*J``D4$]G%"!Y````+")HX
- M`"0O$4ZY```EYEA/+SD````L+PI.N0``&'HC^0```"P````P4$].N0``)@(@I
- M>0```!@@@$ZY```F-"!Y````&"%```9G&DAX`^U(>@`Z3KD``"8D('D````89
- M(4``#%!/+SD````P+SD````T3KD```9B0J=.N0``(\)/[P`,3-]$#$Y=3G4JA
- M`$Y5``!(YSPR)&T`$"!M``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`P
- M8`8F>0```JH0$TB`2,#0K0`,5(`CP````#A"IR\Y````.$ZY```H1"/`````[
- M/%!/9@A,WTP\3EU.=1`32(!(P"H`+P4@2U*(+P@O.0```#Q.N0``&%@@>0``K
- M`#S1Q4/Z`700V6;\+RT`#"\*+SD````\3KD``!@T('D````\0C!8`"/\````E
- M`0```#0@>0```#S1Q29(4HLD2T_O`!@0$TB`2,`J`+"\````(&<@NKP````)?
- M9QBZO`````QG$+J\````#6<(NKP````*9@12BV#,#!,`(&T``(X,$P`B9C)2"
- MBR!+4HL0$$B`2,`J`&<@($I2BA"%NKP````B9A`,$P`B9@12BV`&0BK__V`"7
- M8-)@1"!+4HL0$$B`2,`J`&<PNKP````@9RBZO`````EG(+J\````#&<8NKP`Q
- M```-9Q"ZO`````IG""!*4HH0A6#"($I2BD(02H5F`E.+4KD````T8`#_.D(2)
- M0J<@.0```#12@.6`+P!.N0``*$0CP````#!03V8*0KD````T8`#^I'H`)GD`[
- M```\8"`@!>6`('D````P(8L(`"!+(`A*&&;\D<!3B%*(U\A2A;JY````-&W8"
- M(`7E@"!Y````,$*P"`!@`/Y@(``P/'__8`0P+P`.(&\`!$H89OQ32")O``A3$
- M0!#95\C__&<"0A`@+P`$3G5,[P,```0@""(O``Q@`A#95\G__&<&4D%@`D(8]
- M4<G__$YU3E4``$CG/C(D;0`(0J=(>@"D3KD``"CH(\````!`4$]F"$S?3'Q.*
- M74YU(&T`#")H`"0O*0`$3KD``"E8*`!83V=:2'H`?2!$+R@`-DZY```I.B9`;
- M2H!03V<X2'@#[2\+3KD``"8D+`!03V<F(`;E@"H`($4E:``(`*0E1@"<2'@#X
- M[4AZ`$1.N0``)B0E0`"@4$\O!$ZY```I2EA/+SD```!`3KD``"::0KD```!`F
- M6$]@`/]P:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$Y5``!(YS`"2&T`#"\M``A(U
- M>0``'@Q.N0``&?A/[P`,3-]`#$Y=3G5.50``2.<X(B1M`!`,K0````0`%&8(V
- M(&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*M`!1*K0`,;!)$K0`,2H1LV
- M"D2$*WP````!`!0B+0`,(`1.N0``':9!^0```%Q3BA2P"``B+0`,(`1.N0``<
- M';(H`&;82JT`%&<&4XH4O``M(`I,WT0<3EU.=4Y5_Q1(YS@R)&T`""9M``Q"S
- MK?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#/+B\````)68``Q9"+?\B*WP````!=
- M__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````M9A!"K?_T($M2`
- MBQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H`+B\````*F8:%
- M(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#A"K?_H8"1R"B`M_^A.N0``);30<
- MA)"\````,"M`_^@@2U*+$!!(@$C`*`!!^0```&\(,``"2`!FSKB\````+F9F_
- M($M2BQ`02(!(P"@`L+P````J9AH@;?_\6*W__"M0_^P@2U*+$!!(@$C`*`!@D
- M.$*M_^Q@)'(*("W_[$ZY```EM-"$D+P````P*T#_["!+4HL0$$B`2,`H`$'YJ
- M````;P@P``)(`&;.*WP````$_^2XO````&QF%B!+4HL0$$B`2,`H`"M\````6
- M!/_D8!2XO````&AF#"!+4HL0$$B`2,`H`"`$8```@BM\````"/_@8!PK?````
- M``K_X&`2*WP````0_^!@""M\____]O_@+RW_Y$AM_R(O+?_@+RW__$ZZ_:0K-
- M0/_<("W_Y-&M__Q/[P`08%P@;?_\6*W__")0*TG_W"`)2AEF_)/`4XDK2?_D+
- M8$H@;?_\6*W__"@00>W_(2M(_]P0A&`HD+P```!C9^)3@&>2D+P````+9P#_C
- M;%F`9[)5@&<`_VQ7@&<`_W!@S$'M_R*1[?_<*TC_Y"`M_^2PK?_L;P8K;?_L,
- M_^1*K?_T9W`@;?_<#!``+6<*(&W_W`P0`"MF-`RM````,/_P9BI3K?_H(&W_J
- MW%*M_]P0$$B`2,`O`$Z2L+S_____6$]F"G#_3-],'$Y=3G5@&"\M__!.DK"\S
- M_____UA/9@1P_V#B4JW_^"`M_^A3K?_HL*W_Y&[:0JW_X&`D(&W_W%*M_]P0[
- M$$B`2,`O`$Z2L+S_____6$]F!'#_8*I2K?_@(&W_W$H09PH@+?_@L*W_[&W*=
- M("W_X-&M__A*K?_T9BI@&DAX`"!.DK"\_____UA/9@9P_V``_W!2K?_X("W_0
- MZ%.M_^BPK?_D;MA@&"\$3I*PO/____]83V8&</]@`/](4JW_^&``_+@@+?_X_
- M8`#_.$CG2`!"A$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(A
- MYT@`0H1*@&H$1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`+
- M3G5(YS``2$%*068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(?
- M028!(@!"04A!2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!(YS`"5
- M2'D```$&+RT`"$ZY```>+E!/3-]`#$Y=3G5.50``2.<X`B@M``@O+0`,+P1.5
- MN0``'GRXO`````I03V8J(&T`#!`H``Q(@$C`"```!V<82'C__R\M``Q.N0``H
- M'X!03TS?0!Q.74YU8/9.50``2.<P(B1M``P@4K'J``1E'"`M``C`O````/\O;
- M`"\*3KH`X%!/3-]$#$Y=3G4@4E*2$"T`"Q"`2(!(P,"\````_V#B3E4``$CGV
- M,")!^0```/`D2"!*U?P````6+PAA%%A/0?D```*HM<AEZ$S?1`Q.74YU3E4`&
- M`$CG."(D;0`(>``@"F8*</],WT0<3EU.=4HJ``QG6@@J``(`#&<,2'C__R\*'
- M85PH`%!/$"H`#4B`2,`O`$ZY```E5(B`""H``0`,6$]G#"\J``A.N0``(;Y8*
- M3P@J``4`#&<6+RH`$DZY```BA"\J`!).N0``(;Y03T*20JH`!$*J``A"*@`,'
- M(`1@ADY5__Y(YS@B)&T`"$'Z_S0CR````$0(*@`$``QG"G#_3-]$'$Y=3G4(,
- M*@`"``QG-B!2D>H`""@(+P0O*@`($"H`#4B`2,`O`$ZY```BMK"$3^\`#&<0H
- M".H`!``,0I)"J@`$</]@N@RM_____P`,9A`(J@`"``Q"DD*J``1P`&"@2JH`N
- M"&8*+PI.N0``(+I83PQJ``$`$&8R&VT`#___2'@``4AM__\0*@`-2(!(P"\`G
- M3KD``"*VL+P````!3^\`#&:4("T`#&``_U@DJ@`(,"H`$$C`T*H`""5```0(;
- MZ@`"``P@4E*2$"T`#Q"`2(!(P,"\````_V``_RA.50``2.<P(D'Y````\"1(V
- M2BH`#&<<U?P````60?D```*HM<AE"G``3-]$#$Y=3G5@WD*20JH`!$*J``@@I
- M"F#H3E7__$CG,"(D;0`(2'@$`$ZY```AIBM`__Q83V8:-7P``0`0($K1_```B
- M``XE2``(3-]$#$Y=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-2(!(P"\`3KD`2
- M`"(02H!83V<&`"H`@``,8,A.50``2.<P,B1Y````!&`6)E(@*@`$4(`O`"\*W
- M3KD``"B04$\D2R`*9N9"N0````1,WTP,3EU.=4Y5``!(YS`B0?K_OB/(````Z
- M2$*G("T`"%"`+P!.N0``*$0D0$J`4$]F"G``3-]$#$Y=3G4DN0````0E;0`()
- M``0CR@````0@"E"`8.!.50``2.<P`B\M``AAIEA/3-]`#$Y=3G5.50``2.<PL
- M,I?+)'D````$8`X@;0`(48BQRF<2)DHD4B`*9NYP_TS?3`Q.74YU(`MG!":27
- M8`8CT@````0@*@`$4(`O`"\*3KD``"B0<`!03V#43E4``$CG,")R!B`M``A.F
- MN0``);0D0-7Y````&$JM``AM%#`Y```"J$C`(BT`"+*`;`1*DF84(_P````"G
- M````''#_3-]$#$Y=3G5R!B`M``A.N0``);0@>0```!@O,`@`3KD``"862H!8>
- M3V<$<`%@`G``8,Y.50``2.<P`B\M``A.N0``)?1*@%A/9A9.N0``)@PCP```\
- M`!QP_TS?0`Q.74YU<`!@]$Y5``!(YSPB*"T`"$ZY```C3'(&(`1.N0``);0D7
- M0-7Y````&$J$;1`P.0```JA(P+B`;`1*DF84(_P````"````''#_3-]$/$Y=,
- M3G4P*@`$P'P``V8.(_P````%````''#_8.`O+0`0+RT`#"\23KD``"9B*@"P!
- MO/____]/[P`,9A!.N0``)@PCP````!QP_V"R(`5@KDY5__Q(YS`"2'@0`$*G<
- M3KD``"D<*T#__`@```Q03V<:2KD````,9@P@+?_\3-]`#$Y=3G5.N0``(XIPX
- M`N3E4``$CG,`)(>``$2'H`)DZY```F-"\`3KD``"9B2'@``4ZY```CPD_O(
- M`!!,WT`,3EU.=5Y#"@!.50``2.<P`DJY````1&<(('D```!$3I`O+0`(3KD``
- M`"/N6$],WT`,3EU.=4Y5__Q(YS@"*VT`"/_\2KD````89S9X`&`,+P1.N0``5
- M)5183U*$,#D```*H2,"X@&WH,#D```*HP?P`!B\`+SD````83KD``"B04$]*+
- MN0```$AG""!Y````2$Z02KD```*N9PXO.0```JY.N0``)DY83TJY````3&<,3
- M('D```!,(+D```!02KD```!49PXO.0```%1.N0``)J!83TJY````6&<.+SD`"
- M``!83KD``":@6$]*N0```%QG#B\Y````7$ZY```FH%A/2KD```!@9PXO.0``8
- M`&!.N0``)J!83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2KD`Q
- M```L9CA*N0```#QG+B\Y````."\Y````/$ZY```HD"`Y````-%*`Y8`O`"\Y\
- M````,$ZY```HD$_O`!!@%$ZY```H@"\Y````+$ZY```I"%A/("W__"YY````"
- M($YU3-]`'$Y=3G5.50``2.<^(B@M``AR!B`$3KD``"6T)$#5^0```!A*A&T0X
- M,#D```*H2,"X@&P$2I)F%"/\`````@```!QP_TS?1'Q.74YU,"H`!,!\@`!F>
- M"B\23KD``"786$]"DG``8-Y(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`"
- MT(),WP`.3G4B+P`$+'D````(3N[_W"(O``0L>0````A.[O^"(B\`!"QY````@
- M"$[N_[@L>0````A.[O_*+'D````(3N[_?"(O``0L>0````A.[O\H3.\`!@`$[
- M+'D````(3N[_XBQY````"$[N_\1,[P`.``0L>0````A.[O_63OD``"94(B\`3
- M!"QY````"$[N_Z9,[P`.``0L>0````A.[O_02.<!!$SO((``#"QY````)$ZNW
- M_Y1,WR"`3G4B;P`$+'D````D3N[^/D[Y```FH")O``0L>0```"1.[OYB3E4`A
- M`$CG.")(>/__3KD``">D*`"PO/____]83V8*<`!,WT0<3EU.=4AY``$``4AXL
- M`").N0``*#XD0$J`4$]F#B\$3KD``"BB<`!83V#2)6T`"``*%6T`#P`)%7P`L
- M!``(0BH`#A5$``]"ITZY```H;"5``!!*K0`(6$]G#"\*3KD``">66$]@#$AJ"
- M`!1.N0``*+Y83R`*8(A.50``2.<P(B1M``A*J@`*9PHO"DZY```H^EA/%7P``
- M_P`()7S_____`!1P`!`J``\O`$ZY```HHDAX`"(O"DZY```HBD_O``Q,WT0,*
- M3EU.=2)O``0L>0```"1.[OZ>("\`!"QY````)$[N_K9.50``2.<P(DJM``AFY
- M"G``3-]$#$Y=3G5(>0`!``$O+0`,3KD``"@^)$!*@%!/9@1P`<%7P`!0`(\
- M-6T`#@`2)6T`"``.(`I@QDY5``!(YS`B)&T`""`*9@A,WT0,3EU.=15\`/\`(
- M""5\_____P`4)7S_____`!AP`#`J`!(O`"\*3KD``"B*4$]@SD[Y```H1$SOF
- M``,`!"QY````)$[N_SI(YP,`(F\`#"QY````)$ZN_CA,WP#`3G5.^0``*'(B`
- M;P`$+'D````D3N[^VBQY````)$[N_WQ.^0``*)`B;P`$("\`""QY````)$[N`
- M_RX@+P`$+'D````D3N[^L"!O``0L>0```"1.[OZ,(&\`!""(6)!"J``$(4@`/
- M"$YU(&\`!$SO`@$`""(O`!`L>0```"1.[OY$+'D````D(F\`!"`O``A.[OW82
- M(F\`!"QY````)$[N_I@B;P`$+'D````D3N[^AD[Y```I'$SO``,`!"QY````!
- M)$[N_LX@;P`$+'D````D3N[^@$SO`P``!"QY````0$[N_Z`@;P`$+'D```!`\
- M3N[_IB!O``0L>0```$!.[O^R``````/L````1`````$```'B```"&@```Z``<
- M``/<```#Y```!"8```8H```&<@``!K````:X```&O@``!OP```<B```(Y```E
- M"U0```XP```..```#D0```Y:```.?@``#IH```ZD```.M```#N@```]4```/M
- M9```#VH```]V```/@```#Y8```^F```/L@``#[@```_(```/V@``#^````_L]
- M```07```$&@``!!N```0A@``$(X``!">```0I```$+0``!"Z```23```$GX`T
- M`!.F```4(```%)P``!2R```67```&<@``!K6```;1```'A8``![,```>X@``C
- M((0``""8```B-```(N```"06```D(@``)$P``"14```E>````+(````````!L
- MK@```=0```(N```"/````G(```*$```"F````JH```+&```"Z@```OP```,:`
- M```#=@```[@```/2```$#```!!H```0L```$-```!$(```1.```$G```!+8`1
- M``32```$X@``!/0```8N```&;```!GP```:0```&T@``!MP```<0```'&@``D
- M!S8```="```'<@``!WX```><```'N@``!]@```?V```($@``""````@Z```(0
- M2```"%0```AR```(E@``"*0```C.```(W```".H```D6```)(@``"3@```E(P
- M```)5@``"5X```EH```+;@``#$@```QV```,I@``#@8```Z.```.V```#P``=
- M``\4```/(@``#S0```]*```0!```$!@``!`F```0.```$$X``!&>```2-@``_
- M$G```!*>```3````$R0``!.*```3E```$_8``!0*```4A@``%+X``!36```52
- M+@``%4@``!5Z```5A```%:H``!6Z```5S```%=H``!7T```6$@``%AH``!9\$
- M```6J@``%LP``!?0```8C@``&+(``!C(```8W```&0(``!D0```9'@``&58`W
- M`!E<```9P@``&=H``!JX```;)@``'B```!Y"```>;```'S0``!]*```?7@``W
- M'V@``!_*```@"@``(#(``"#,```A$```(4```"%X```B!@``(B```")B```B3
- M<@``(I(``"*>```BQ```(LX``",F```C.@``(UP``"."```CG```(Z0``".N=
- M```CX```)`P``"0T```D6@``)(0``"2:```DL```),8``"4*```E(@``)2X`V
- M`"4Z```E9@``):@``"90```FG```)KP``";B```F\@``)QH``"<N```G/```J
- M)UP``"=Z```GA@``)]8``"@V```H0```*&X``"B,```I&````(@````"```+T
- M]@``#=(```WL```.Q```#]```!!\```0P```$NX``!,:```3G```$[H``!/BY
- M```4$```%"8``!0^```42```%'(``!3$```4W@``%.8``!3P```4_```%0@`'
- M`!4.```5&@``%2```!52```56```%60``!6*```5D```%9X``!6R```5P```G
- M%<0``!72```5X```%?H``!8&```6#```%FX``!9V```6@@``%J0``!:P```6`
- MQ@``%M(``!;@```6Y@``%[8``!?$```7U@``%^```!?L```7^```&!0``!@@B
- M```8E```&1@``!DD```?D@``(2P``"%.```A:```(9```"&<```AR@``(?8``
- M`"(H```B3```(F@``"*D```BU@``(O0``",2```C0```(VX``"/,```CU```E
- M(_X``"0N```D/```)$0``"1B```D:@``)'```"1V```D?@``)(P``"24```DK
- MH@``)*H``"2X```DP```).X``"3V```D_@``)00``"40```E'```)30``"5&A
- M```E;@``)8P``"7>```E[```)?H``"8$```F#@``)AP``"8L```F-@``)D8`Q
- M`"9:```F:@``)GX``":2```FI@``)YP``">J```H3```*%X``"AX```H@@``0
- M*)H``"BH```HM@``*.```"CJ```I````*0X``"DD```I,@``*4(``"E0```I?
- M7@````````/R```#Z@```*TQ+C``````!````!<````S````3````&<```"!^
- M````H````,4```#B````^@```18```$_```!40```6$```%P```!?0``````[
- M`````````0````$````!`````3`Q,C,T-38W.#EA8F-D968````@("`@("`@&
- M("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,P
- M#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`2
- M"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`(``````````````````!%
- M``````$``````````````````````0$````!``````````````````````$"'
- M`````0``````````````````````````````````````````````````````!
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M`````````````````````````````````````````````````````````````
- M```````````````````````````````4`````````````````^P````0````3
- M``````0````(````#````!`````4````&````!P````@````)````"@````L(
- H````,````#0````X````/````$`````````#\@```^L````9```#\B@`Q
- ``
- end
- size 13000
- SHAR_EOF
- # End of shell archive
- exit 0
- --
- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
- Have five nice days.
-